package com.future.allUtils.constants;

import org.springframework.beans.factory.annotation.Value;

/**
 * Redis缓存常量及Key前缀定义（中小学生健康监控系统专用）
 */
public class RedisCacheConstants {

    // ================================== 缓存时效常量（单位：秒） ==================================

    /**
     * token刷新阈值
     */
    public static final long REFRESH_THRESHOLD = 600*2L;// 20分钟


    // ================================== 缓存时效常量（单位：秒） ==================================
    /**
     * 缓存空值的过期时间（防缓存穿透），适用于查询无结果的场景（如不存在的用户、问卷）
     */
    public static final Long CACHE_NULL_TTL = 5L;


    /**
     * 短期缓存过期时间（适用于高频变动数据）：如在线状态、未读消息数
     */
    public static final Long CACHE_SHORT_TTL = 60L; // 1分钟

    /**
     * 普通缓存过期时间（适用于中等变动数据）：如用户信息、班级信息、文章列表
     */
    public static final Long CACHE_NORMAL_TTL = 60 * 60L; // 60分钟

    /**
     * 长期缓存过期时间（适用于低频变动数据）：如心理知识、公告、权限配置
     */
    public static final Long CACHE_LONG_TTL = 24 * 60 * 60L; // 1天

    /**
     * 问卷缓存过期时间（问卷数据发布后相对稳定，但若更新需主动失效）
     */
    public static final Long CACHE_QUESTIONNAIRE_TTL = 7 * 24 * 60 * 60L; // 7天

    /**
     * 分布式锁过期时间（防止死锁，需大于业务执行时间）
     */
    public static final Long LOCK_EXPIRE_TTL = 30L; // 30秒

    /**

     缓存空值的随机过期时间（防缓存穿透，避免缓存同时失效引发缓存雪崩）
     适用于查询无结果的场景（如不存在的用户、问卷），随机值分散过期时间
     */
    public static final Long CACHE_NULL_TTL_RANDOM = (long) (5 + Math.random () * 5); // 5-10 秒随机值

    // ================================== Key前缀定义（按业务模块划分） ==================================
    /**
     * 分隔符（统一用冒号，使Key结构清晰）
     */
    public static final String KEY_SEPARATOR = ":";

    // ------------------------------ 用户与权限模块 ------------------------------
    /**
     * 用户登录token缓存Key前缀
     * 格式：login:token:{userId} → 存储用户登录的token
     */
    public static final String LOGIN_TOKEN_PREFIX = "login_token" + KEY_SEPARATOR;

    /**
     * 用户基本信息缓存Key前缀
     * 格式：user:info:{userId} → 存储用户表（user）的JSON数据
     */
    public static final String USER_INFO_PREFIX = "user:info" + KEY_SEPARATOR;

    public static final String USER_INFO_KEY = "user:" + KEY_SEPARATOR;

    /**
     * 用户角色缓存Key前缀
     * 格式：user:roles:{userId} → 存储用户关联的角色列表（如["学生","管理员"]）
     */
    public static final String USER_ROLES_PREFIX = "user:roles" + KEY_SEPARATOR;

    /**
     * 角色权限缓存Key前缀
     * 格式：role:perms:{roleId} → 存储角色关联的权限编码列表（如["article:pub","questionnaire:create"]）
     */
    public static final String ROLE_PERMS_PREFIX = "role:perms" + KEY_SEPARATOR;

    /**
     * 用户在线状态缓存Key前缀
     * 格式：user:online:{userId} → 存储在线状态（1在线/0离线），配合WebSocket实时更新
     */
    public static final String USER_ONLINE_PREFIX = "user:online" + KEY_SEPARATOR;

    /**
     * 用户发送验证码缓存Key前缀
     */
    public static final String CAPTCHA_PREFIX = "captcha" + KEY_SEPARATOR;

    // ------------------------------ 班级与问卷模块 ------------------------------
    /**
     * 班级信息缓存Key前缀
     * 格式：class:info:{classId} → 存储班级表（class）的JSON数据
     */
    public static final String CLASS_INFO_PREFIX = "class:info" + KEY_SEPARATOR;

    /**
     * 班级问卷列表缓存Key前缀
     * 格式：class:questionnaire:{classId} → 存储班级关联的问卷ID列表（如[1001,1002]）
     */
    public static final String CLASS_QUESTIONNAIRE_PREFIX = "class:questionnaire" + KEY_SEPARATOR;

    /**
     * 班级学生列表缓存Key前缀
     * 格式：class:students:{classId} → 存储班级关联的学生ID列表（如[1001,1002]）
     */
    public static final String CLASS_STUDENTS_PREFIX = "class:students" + KEY_SEPARATOR;

    /**
     * 问卷基本信息缓存Key前缀
     * 格式：questionnaire:info:{questionnaireId} → 存储问卷表（questionnaire）的JSON数据
     */
    public static final String QUESTIONNAIRE_INFO_PREFIX = "questionnaire:info" + KEY_SEPARATOR;

    /**
     * 问卷题目列表缓存Key前缀
     * 格式：questionnaire:questions:{questionnaireId} → 存储问卷关联的题目及选项列表（JSON）
     */
    public static final String QUESTIONNAIRE_QUESTIONS_PREFIX = "questionnaire:questions" + KEY_SEPARATOR;

    /**
     * 学生答卷缓存Key前缀
     * 格式：answer:sheet:{userId}:{questionnaireId} → 存储学生答卷表（answer_sheet）的JSON数据
     */
    public static final String ANSWER_SHEET_PREFIX = "answer:sheet" + KEY_SEPARATOR;

    /**
     * 班级健康数据统计缓存Key前缀（如平均分、异常人数）
     * 格式：class:health:stats:{classId} → 存储统计结果（JSON），教师端展示用
     */
    public static final String CLASS_HEALTH_STATS_PREFIX = "class:health:stats" + KEY_SEPARATOR;
    /**
     * 个人健康详情 (health 表)
     * 格式：class:health:
     */
    public static final String  PERSONAL_HEALTH_PREFIX="personal:health" + KEY_SEPARATOR;
    /**
     * 全校健康数据统计缓存Key前缀
     * 格式：school:health:stats → 存储全校统计结果（JSON），心理医生/管理员端展示用
     */
    public static final String SCHOOL_HEALTH_STATS_PREFIX = "school:health:stats" + KEY_SEPARATOR;
    /**
     * 老师的班级id缓存key前缀
     * 格式：teacher:class:{teacherId} → 存储教师关联的班级ID列表（如[1001,1002]）
     */
    public static final String TEACHER_CLASS_PREFIX = "teacher:class" + KEY_SEPARATOR;




    // ------------------------------ 通信与消息模块 ------------------------------
    /**
     * 聊天室成员详细信息
     * 格式：chat:user:roomId → ZSet 类型，存储聊天室 ID 或 JSON，score 为加入时间戳
     */
    public static final String USER_CHAT_ROOMS_PREFIX = "chat:user:rooms" + KEY_SEPARATOR;

    /**
     * 聊天室成员列表缓存Key前缀
     * 格式：chat:room:members:{roomId} → 存储聊天室成员ID列表（如[1001,1002]）
     */
    public static final String CHAT_ROOM_MEMBERS_PREFIX = "chat:room:members" + KEY_SEPARATOR;

    /**
     * 未读消息数缓存Key前缀
     * 格式：chat:unread:{userId}:{roomId} → 存储用户在某聊天室的未读消息数量
     */
    public static final String CHAT_UNREAD_COUNT_PREFIX = "chat:unread" + KEY_SEPARATOR;

    /**
     * 系统通知未读总数缓存Key前缀
     * 格式：notification:unread:total:{userId} → 存储用户的未读通知总数
     */
    public static final String NOTIFICATION_UNREAD_TOTAL_PREFIX = "notification:unread:total" + KEY_SEPARATOR;
    /**
     * 系统未读通知缓存key前缀
     * 格式:notification:unread:type:{}userId}
     * 按类型获取未读消息数
     */
    public static final String NOTIFICATION_UNREAD_PREFIX="notification:unread"+KEY_SEPARATOR;
    /**
     * 离线消息
     * 格式:notfication:offline:type:userId
     */
    public static final String NOTIFICATION_OFFLINE_PREFIX="notification:offline"+KEY_SEPARATOR;
    /**
     * 系统聊天记录
     * 格式：notification:type:userId
     */
    public static final String NOTIFICATION_MESSAGE="notification"+KEY_SEPARATOR;
    /**
     * 聊天记录缓存key前缀
     * 完整键格式: CHAT_MESSAGE_PREFIX + 聊天室ID + KEY_SEPARATOR + 消息ID
     * 示例: "chat:message:room123:msg456"
     */
    public static final String CHAT_MESSAGE_PREFIX = "chat:message" + KEY_SEPARATOR;
    /**
     * 用户未读消息ID列表缓存（ZSet结构，score为消息时间戳）
     * 格式：chat:unread:ids:{userId}:{roomId} → 存储该用户在房间内的未读消息ID
     */
    public static final String CHAT_UNREAD_MESSAGE_IDS_PREFIX = "chat:unread:ids" + KEY_SEPARATOR;
    /**
     * 离线消息列表缓存Key前缀
     * 格式：chat:offline:{receiverId}:{roomId} → 存储指定用户在指定聊天室的离线消息列表（List结构）
     */
    public static final String CHAT_OFFLINE_MESSAGE_LIST_PREFIX = "chat:offline" + KEY_SEPARATOR;
    // ------------------------------ 内容与资源模块 ------------------------------
    /**
     * 文章信息缓存Key前缀
     * 格式：article:info:{articleId} → 存储文章表（article）的JSON数据（需审核通过）
     */
    public static final String ARTICLE_INFO_PREFIX = "article:info" + KEY_SEPARATOR;

    /**
     * 文章列表缓存Key前缀（按作者/类型分页）
     * 格式：article:list:{authorId}:{pageNum} → 存储分页文章ID列表（如[2001,2002]）
     */
    public static final String ARTICLE_LIST_PREFIX = "article:list" + KEY_SEPARATOR;

    /**
     * 心理知识缓存Key前缀
     * 格式：knowledge:info:{knowledgeId} → 存储心理知识表（psychological_knowledge）的JSON数据
     */
    public static final String PSYCHOLOGICAL_KNOWLEDGE_PREFIX = "knowledge:info" + KEY_SEPARATOR;
    /**
     *  浏览心里知识的缓存key前置
     */
    public static final String PSYCHOLOGICAL_KNOWLEDGE_VIEWS_PREFIX = "knowledge:views" + KEY_SEPARATOR;

    /**
     * 公告缓存Key前缀（置顶公告长期缓存）
     * 格式：announcement:info:{announcementId} → 存储公告表（announcement）的JSON数据
     */
    public static final String ANNOUNCEMENT_INFO_PREFIX = "announcement:info" + KEY_SEPARATOR;

    /**
     * 媒体资源缓存Key前缀（审核通过的资源）
     * 格式：media:info:{resourceId} → 存储媒体资源表（media_resource）的JSON数据
     */
    public static final String MEDIA_RESOURCE_PREFIX = "media:info" + KEY_SEPARATOR;


    // ------------------------------ 分布式锁与限流 ------------------------------
    /**
     * 分布式锁Key前缀（防止并发操作冲突）
     * 格式：lock:questionnaire:{questionnaireId} → 问卷编辑锁；lock:user:{userId} → 用户信息更新锁
     */
    public static final String LOCK_PREFIX = "lock" + KEY_SEPARATOR;

    /**
     * 接口限流Key前缀（防止恶意请求）
     * 格式：rate:limit:login:{ip} → 登录接口限流；rate:limit:upload:{userId} → 上传接口限流
     */
    public static final String RATE_LIMIT_PREFIX = "rate:limit" + KEY_SEPARATOR;

    /**
     * 布隆过滤器Key（过滤不存在的问卷/用户ID，防缓存穿透）
     * 格式：bloom:questionnaire → 存储所有问卷ID；bloom:user → 存储所有用户ID
     */
    public static final String BLOOM_FILTER_PREFIX = "bloom" + KEY_SEPARATOR;


    // ------------------------------ 计数相关 ------------------------------
    /**
     * 文章点赞数缓存Key前缀
     * 格式：count:like:article:{articleId} → 存储文章的实时点赞数
     */
    public static final String COUNT_LIKE_ARTICLE_PREFIX = "count:like:article" + KEY_SEPARATOR;

    /**
     * 媒体资源下载数缓存Key前缀
     * 格式：count:download:media:{resourceId} → 存储资源的实时下载数
     */
    public static final String COUNT_DOWNLOAD_MEDIA_PREFIX = "count:download:media" + KEY_SEPARATOR;


}